#include "BloqueCompresor.h"
#include "CompresorAritmetico.h"
#include "Excepciones.h"

namespace Toolkit
{

BloqueCompresor::BloqueCompresor(const unsigned long int &tamanoBloque,
		const TipoSerializacion &tSerializacion) :
	Bloque(tamanoBloque, tSerializacion)
{

}

BloqueCompresor::~BloqueCompresor()
{

}

void BloqueCompresor::agregar(Componente *componente, const Clave &clave)
{
	this->componentes.push_back(componente);
	long int libre = this->espacioLibre();
	this->componentes.pop_back();

	if (libre < 0) {
		throw DesbordeDeBloqueException();
	} else {
		agregarSinChequearMaximo(componente, clave);
	}

}

Componente *BloqueCompresor::clonar() const
{
	return new BloqueCompresor(tamanoBloque, tSerializacion);
}

void BloqueCompresor::serializar(stringstream &stream) const
{
	stringstream ssAux;
	Bloque::serializar(ssAux);

	string compreso = CompresorAritmetico::instancia().comprimir(ssAux.str());
	stream.write(compreso.c_str(), compreso.size());
}

void BloqueCompresor::hidratar(stringstream &stream, const Dato &dato)
{
	stringstream ssAux;

	//Ver bien si esto no rompe el compresor; se le tira todo el str
	ssAux.str(CompresorAritmetico::instancia().descomprimir(stream.str()));
	Bloque::hidratar(ssAux, dato);

}

}
